const age:number = 22

function getAge (age: number): number {
  return age
}

console.log(getAge(age))
// 基元类型 string number boolean
// 数组 方式1 type [] 方式2 Array<number>  ts 中对数组类型进行限制， 数组里面元素必须是同一个类型了（js 可以放不同的）
// 对象类型 {x: number, y?: number}  可选参数
// number | string 联合类型

// 类型别名  ts 中新增关键词type 
// type Point = { x: number, y: number }
// function printPonit (p: Point) {
//    console.log(p)
// }

// type ID = number | string
// function printId (id: ID) {
//   console.log(id)
// }

// 接口是定义类型的一种方式， 使用interface 关键词
// 可以做到type 关键词的所有功能，除此之外还能实现类型的继承，复用抽象
// interface Point  {
//    x: number,     
//    y: number
// }

// function printPonit (p: Point) {
//    console.log(p)
// }

//interface Animal  {
//    name: string,     
// }

// interface Bear extends Animal { 
//   likeHoney: Boolean
// }

// const b1: Bear = {
//   name: 'bear',
//   likeHoney: true 
// }


// 通过类型别名也可以实现接口继承这种效果
// type Animal = {
//   name: string,
// }

// type Bear = Animal & {
//   likeHoney: Boolean
// }


// 类型断言 2 种写法
// const myCanvas = document.getElementById('myCanvas') as HTMLCanvasElement

// const myCanvas2 = < HTMLCanvasElement> document.getElementById('myCanvas')

// 可以直接将字符串作为类型 --- 就可以对参数固定在一个可选的范围内

// function printX(a: number, align: 'left' | 'center' | 'right') {
//   console.log(a, align)
//  }

//  printX(1, 'left')
//  printX(1, 'leftdddd')


// 非空断言， 代表x 不为空或者undefiend 的时候使用length 属性
// function liveDangerous (x?: string | null) {
//   return x!.length
// }


// enum 定义枚举类型